package com.swa99ylum.pxp.a.a008;

import java.io.File;
import java.io.FileInputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.lsy.poi.PluggableFileParser;
import com.lsy.poi.bean.Index;
import com.lsy.poi.cell.CellParser;
import com.lsy.poi.cell.extractor.CeilingCellExtractor;
import com.lsy.poi.cell.extractor.DateCellExtractor;
import com.lsy.poi.row.RowMapper;
import com.lsy.poi.row.RowParser;
import com.lsy.poi.row.indexer.BlankSkippingRowIndexer;
import com.lsy.poi.row.validator.CellSizeValidator;
import com.lsy.poi.row.validator.RowValidator;
import com.lsy.poi.row.validator.UniqueValidator;
import com.lsy.poi.sheet.SheetParser;
import com.lsy.poi.sheet.validator.SheetValidator;

public class Test2 {

	
	
	public static void main(String[] args) throws Exception {
		
		
		
		File file = new File("VP_VS_RS.xlsx");
		System.out.println(file.getAbsolutePath());
		
		
		FileInputStream fis = new FileInputStream(file);
		XSSFWorkbook xwb = new XSSFWorkbook(fis);
		
		
		List<Foo> fooList = new ArrayList<Foo>();
		
		Index indexZXC = new Index(1);
		
		//所有的 index，都是 左闭右闭 的
		SheetParser[] sheetParsers = new SheetParser[] {
//				new SheetParser(new String[]{"Sheet4"/*, "Sheet2"*/},
//					new RowParser[] {
//						//如何 判断 RowParser 元素之间，beginIndex、endIndex 之间有 交错？
//						new RowParser(0, 0, 
//								RowParser.constructHeaderParsers(new String[]{"AAA", "BBB", "CCC", "DDD"})
//						),
//						new RowParser(1, 8, //TODO: 当 rowIndex 超出 实际时，会报错，但是 报错信息 不准确
//								new CellParser[] {
//									new CellParser(0, 1),
//									new CellParser(2, 2, new DateCellExtractor()),
//									new CellParser(3, 3),
//								},
//								/** 宗旨：rowMapper 要和  CellSizeValidator 对应 ，这要 开发者 自己 协调好
//								 *  1、PluggableFileParser 只负责 收集所有存在的 单元格
//								 *  2、至于 每个 row 的单元格 个数 是否正确 ；是否将 该 row map 到 javaBean，这都需要 开发者 在 rowMapper 中自己决定
//								 */
//								new RowValidator[]{
//									new CellSizeValidator(4),
//									new UniqueValidator(new HashMap<String, String>(), new int[]{1, 3}, new String[]{"A字段", "B字段"})
//								},
//								sss,
//								new RowMapper<Student>(new String[]{"name" , "address", "birthDay"}, Student.class)
//								//TODO: 如果是 String、基本类型，则 可以不用定义 propertyNames，并在 RowParser 173 行 直接复制，不需要使用 BeanUtils.setProperty
//								
//						),
//					}
//				),
				new SheetParser(new String[]{"VP_VS_RS"/*, "Sheet2"*/},
						new RowParser[] {
							//如何 判断 RowParser 元素之间，beginIndex、endIndex 之间有 交错？
							new RowParser(0, 0, 
									RowParser.constructHeaderParsers(new String[]{
											"VP_3/16", "", "",
											
											"Jan", "Feb", "Mar", "Apr", "May", "Jun", 
											"Jul", "Aug", "Sep", "Oct", "Nov", "Dec", 
											
											"Q1", "Q2", "Q3", "Q4", 
											"1st half ", "2nd half ", 
											
											"FY"
									})
							),
							new RowParser(new BlankSkippingRowIndexer(indexZXC), //TODO: 当 rowIndex 超出 实际时，会报错，但是 报错信息 不准确
									new CellParser[] {
										new CellParser(1, 1, new CeilingCellExtractor()),
										new CellParser(2, 2),
										new CellParser(3, 21, new IntegerCellExtractor()),
									},
									/** 宗旨：rowMapper 要和  CellSizeValidator 对应 ，这要 开发者 自己 协调好
									 *  1、PluggableFileParser 只负责 收集所有存在的 单元格
									 *  2、至于 每个 row 的单元格 个数 是否正确 ；是否将 该 row map 到 javaBean，这都需要 开发者 在 rowMapper 中自己决定
									 */
									new RowValidator[]{
//										new CellSizeValidator(4),
										new UniqueValidator(new HashMap<String, String>(), new int[]{0, 1}, new String[]{"车厂", "车型"})
									},
									fooList,
									new RowMapper<Foo>(new String[]{
											"plant", "carType",
											
											"month1", "month2", "month3", "month4", "month5", "month6",
											"month7", "month8", "month9", "month10", "month11", "month12",
											
											"quarter1", "quarter2", "quarter3", "quarter4",
											"halfYear1", "halfYear2", "fullYear"
									
									}, Foo.class)
//									new RowMapper<Foo>(new String[]{"name" , "address", "birthDay"}, Foo.class)
									
							),
//							
//							new RowParser(new BlankSkippingRowIndexer(indexZXC), //TODO: 当 rowIndex 超出 实际时，会报错，但是 报错信息 不准确
//									new CellParser[] {
//										new CellParser(0, 1),
//										new CellParser(2, 2, new DateCellExtractor()),
//										new CellParser(3, 3),
//									},
//									/** 宗旨：rowMapper 要和  CellSizeValidator 对应 ，这要 开发者 自己 协调好
//									 *  1、PluggableFileParser 只负责 收集所有存在的 单元格
//									 *  2、至于 每个 row 的单元格 个数 是否正确 ；是否将 该 row map 到 javaBean，这都需要 开发者 在 rowMapper 中自己决定
//									 */
//									new RowValidator[]{
//										new CellSizeValidator(4),
//										new UniqueValidator(new HashMap<String, String>(), new int[]{1, 3}, new String[]{"A字段", "B字段"})
//									},
//									sss02,
//									new RowMapper<Student>(new String[]{"name" , "address", "birthDay"}, Student.class)
//									//TODO: 如果是 String、基本类型，则 可以不用定义 propertyNames，并在 RowParser 173 行 直接复制，不需要使用 BeanUtils.setProperty
//									
//							),
						}
				),
//				new SheetParser(new String[]{"Sheet3"},
//						new RowParser[] {
//							//如何 判断 RowParser 元素之间，beginIndex、endIndex 之间有 交错？
//							new RowParser(0, 0, 
//									RowParser.constructHeaderParsers(new String[]{"AB111C", "AAA", "BBB", "CCC", "DDD"})
//							),
//							new RowParser(1, 100, //TODO: 当 rowIndex 超出 实际时，会报错，但是 报错信息 不准确
//									new CellParser[] {
//										new CellParser(0, new CeilingCellExtractor()),
//										new CellParser(1, 2),
//										new CellParser(3, 3, new DateCellExtractor()),
//										new CellParser(4, 4),
//									},
//									new RowValidator[]{
//										new UniqueValidator(new HashMap<String, String>(), new int[]{2, 4}, new String[]{"A字段", "B字段"})
//									},
//									sss,
//									new RowMapper<Student>(new String[]{"batch", "name" , "address", "birthDay"}, Student.class)
//									//TODO: 如果是 String、基本类型，则 可以不用定义 propertyNames，并在 RowParser 173 行 直接复制，不需要使用 BeanUtils.setProperty
//									
//							),
//						}
//					),
		};
		
		
		List<String> errors = new ArrayList<String>();
		
		new PluggableFileParser(xwb, sheetParsers, errors).parse();
		
		
		System.out.println("=====> 错误个数：" + errors.size());
		for (String error : errors) {
			System.out.println(error);
		}
		System.out.println("====================>>>>>");
		for (Foo foo : fooList) {
			System.out.println(foo);
		}
		
		
	}
}
